/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.stefanini.resultmundial2014.ejb;

import com.stefanini.mundial2014capadatos.Grupo;
//import java.io.IOException;
//import java.util.*;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.ejb.LocalBean;
import javax.ejb.Stateless;
import javax.ejb.TransactionAttribute;
import javax.ejb.TransactionAttributeType;
import javax.persistence.EntityManager;
import javax.persistence.NoResultException;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;

/**
 *
 * @author CAMALEON
 */

@LocalBean
@Stateless
public class GrupoManager {
    @PersistenceContext    
    
    private EntityManager em;
    
    /*Metodo que verifica si el grupo a grear ya existe apartir de su nombre
     * Si existe retorna true
     * Si no existe retorna false*/
    
    /* (@TransactionAttribute) Obliga que exista una transaccion o no*/
    @TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED)
    public boolean verificaGrupoExistente(String nombre){
        try {
            StringBuilder query = new StringBuilder();
            /* El nombre de la entidad (Tabla) debe llamarse igual a
             * como esta creado en la DB (Distingue mayusculas y munisculas*/
            query.append("SELECT u FROM Grupo u ");
            query.append("WHERE u.nombre = :NOMBRE ORDER BY u.nombre" );
            
            Query q = em.createQuery(query.toString(),Grupo.class);
            q.setParameter("NOMBRE", nombre);
            
            //return (Grupo)q.getSingleResult();
            q.getSingleResult();
            return true;
        }catch(NoResultException e){
            Logger.getLogger(GrupoManager.class.getName()).log(Level.SEVERE, "No se encontro grupo con el nombre indicado", e);
            return false;
        } catch (Exception e) {
            Logger.getLogger(GrupoManager.class.getName()).log(Level.SEVERE, "Error al verificar la existencia del grupo", e);
            return false;
        }
    }

    /*Metodo que consulta los grupos existentes*/
    /* (@TransactionAttribute) Obliga que exista una transaccion o no*/
    @TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED)
   public List<Grupo> getAllGrupos(){
       try {
           Query q = em.createNamedQuery("Grupo.findAll");
           return q.getResultList();
       } catch (Exception e) {
           Logger.getLogger(GrupoManager.class.getName()).log(Level.SEVERE,"Error consulta de grupos - GrupoManager", e);
           return new ArrayList<>();
       }
   }
      
    /*Metodo que guarda el grupo en la DB*/
    /* (@TransactionAttribute) Obliga que exista una transaccion o no*/
    @TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
   public boolean guardarGrupo(Grupo grupo,boolean isEdit) {
        try {
           if(isEdit){
               em.merge(grupo);
           }else{
               em.persist(grupo);
           }
           em.flush();
           return true;
       } catch (Exception e) {
           Logger.getLogger(GrupoManager.class.getName()).log(Level.SEVERE,"Error al guardar el grupo", e);
           return false;
       }
    }
   
   /*Metodo que elimina el regiistro de Grupo*/
    /* (@TransactionAttribute) Obliga que exista una transaccion o no*/
    @TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED)
   public boolean eliminaGrupo(Grupo grupo){
       try {
           /*Volverlo el EJB manejado*/
           grupo = em.merge(grupo);
           
           em.remove(grupo);
           em.flush();
           return true;
       } catch (Exception e) {
           Logger.getLogger(GrupoManager.class.getName()).log(Level.SEVERE,
                   "Error al eliminar el grupo", e);
           return false;
       }
   }
}
